function f_init_ghost_opt()
{   #初始化ghost工具的参数
    f_check_work_is_run "gh-ost" "${_t_}"
    #ghost是毫秒, pt-osc是秒, 都是取一半, 业务设置60s, 配置就是30s
    _max_repl_time="$((${max_repl_time}*500))"
    res_log_test="${osc_test_res_log_dir}/gh-ost.$(awk -F/ '{print $NF}' <<< "${sql_file}").test.log"
    res_log="${osc_execute_res_log_dir}/gh-ost.$(awk -F/ '{print $NF}' <<< "${sql_file}").log"
    declare sockFile flagFile
    sockFile="${mysql_host}.${mysql_port}.${mysql_db}.${_t_}.${_PPID}.sock"
    flagFile="${mysql_host}.${mysql_port}.${mysql_db}.${_t_}.${_PPID}.flag"
    gh_socket_file="${script_execute_mark_dir}/$(md5sum <<< "${sockFile}"|awk '{print $1}')_socket_${_PPID}"    #采用md5值的方式, 要不然会因为参数太长导致失败
    pause_file_name="${script_execute_mark_dir}/$(md5sum <<< "${flagFile}"|awk '{print $1}')_pause_${_PPID}"
    check_mdl_timeout="30"                               #检查mdl锁等待的时间, 如果超过这个时间阈值还有mdl等待, 则进行相应处理. 默认是10s, ghost 30s
    unset osc_array flagFile
    osc_array+=("--replica-server-id=$(cut -c 1-9 <<< "$((10#$(date +%N)%8+1))$(date +%N%N)")")    #ghost模拟slave，所以需要为ghost进程指定一个mysql的server id号
    osc_array+=("--serve-socket-file=${gh_socket_file}")             #echo throttle or no-throttle | socat - ${mark_dir}/gh-ost.${_t_}.sock   暂停或者继续执行ghost操作
    osc_array+=("--panic-flag-file=${pause_file_name}")              #执行过程中, 创建该文件后会终止ghost任务, 但是需要手动清理相关临时文件或者临时表
    osc_array+=("--allow-on-master")                                 #--test-on-replica
    #限制连接数和并发数, 当并发数超过running, 连接数超过connect 就停止copy数据
    osc_array+=("--max-load 'Threads_running=${max_running},Threads_connected=${max_threads}'") 
    osc_array+=("--chunk-size=${max_chunk_size}")                    #在每次迭代中处理的行数量(允许范围：100-100000)，默认值为1000。
    osc_array+=("--max-lag-millis=${_max_repl_time}")                #主从复制最大延迟时间，当主从复制延迟时间超过该值后，gh-ost将采取节流(throttle)措施，默认值：1500s。
    osc_array+=("--cut-over-lock-timeout-seconds=30")                #gh-ost在cut-over阶段最大的锁等待时间，当锁超时时，gh-ost的cut-over将重试。(默认值：3)
    osc_array+=("--execute")

    #如果允许添加唯一键, 就用[exact-rowcount + hooks]去检查改表前后的数据行是否一致
    #但是当前版本的ghost有bug, 所以就先注释了, 直接不让用ghost加唯一索引, 1.0.50及之前的有bug, 所以如果1.0.51以后修复了, 可以自行配置
    #[ "${sup_add_unique_key}x" == "1x" ] && osc_array+=("--exact-rowcount")

    [ "${check_slave_repl}x" == "allx" ] && check_slave_repl_list="${mysql_slave_info[@]}" || check_slave_repl_list="${mysql_slave_host}"
    #gh-ost操作结束后, 删除临时表, _tablename_gho, _tablename_ghc表
    [ "${force}x" == "1x" ] && osc_array+=("--initially-drop-old-table --initially-drop-ghost-table") 
    [ "${delete_mode_opt}x" == "1x" ] && osc_array+=("--ok-to-drop-table")   #gh-ost操作结束后, 删除旧表，默认状态是不删除, 会存在_tablename_del表
    return 0
}

function f_init_ptosc_opt()
{   #chunk-size默认值为1000，chunk-time默认值为0.5S, 以适应服务器的性能变化，如上一次复制1000行消耗0.1S, 则下次动态调整chumk-size为5000
    #ghost是毫秒, pt-osc是秒, 都是取一半, 业务设置60s, 配置就是30s
    _max_repl_time="$((${max_repl_time}/2+1))"
    res_log_test="${osc_test_res_log_dir}/pt-ost.$(awk -F/ '{print $NF}' <<< "${sql_file}").test.log"
    res_log="${osc_execute_res_log_dir}/pt-ost.$(awk -F/ '{print $NF}' <<< "${sql_file}").log"
    f_check_work_is_run "pt-online-schema-change" "${_t_}"
    flagFile="${mysql_host}.${mysql_port}.${mysql_db}.${_t_}.${_PPID}.flag"
    pause_file_name="${script_execute_mark_dir}/$(md5sum <<< "${flagFile}"|awk '{print $1}')_pause_${_PPID}"
    unset osc_array flagFile
    [ -f "${max_thread_file}" ] && max_thread_running="$(tail -1 ${max_thread_file})"                #动态获取活跃连接数的值, 动态控制chunk size(pt不能动态调整, 通过这个方式在前期控制chunk size大小)
    grep -qP "^[1-9][0-9]{0,}$" <<< "${max_thread_running}" && echo "" > ${max_thread_file} || max_thread_running=1
    [ "${max_thread_running}" -ge 15 ] && max_chunk_size="2000"       #更小的chunk size能降低pt改表产生的死锁概率
    [ "${max_thread_running}" -ge 20 ] && max_chunk_size="1000"
    [ "${max_thread_running}" -ge 25 ] && max_chunk_size="500"
    [ "${max_thread_running}" -ge 30 ] && max_chunk_size="100"
    osc_array+=("--chunk-size=${max_chunk_size}")                     #每次copy多少数据行
    osc_array+=("--max-lag=${_max_repl_time}")                        #当主从复制延迟时间超过该值后, 会暂停"--check-interval"秒时间, 然后再检查，直到主从延时小于该值
    osc_array+=("--check-interval=5")                                 #出现延迟后暂停多少秒
    osc_array+=("--no-check-replication-filters")
    osc_array+=("--check-alter")
    osc_array+=("--max-load='Threads_running=${max_running}'")
    osc_array+=("--critical-load='Threads_running=${max_threads}'")
    osc_array+=("--recurse=0")
    osc_array+=("--ask-pass")
    osc_array+=("--execute")
    osc_array+=("--pause-file=${pause_file_name}")
    osc_array+=("--print")
    [ "${sup_add_unique_key}x" != "1x" ] && osc_array+=("--check-unique-key-change")  #如果没有配置允许添加唯一键, 那就用这个参数检查是否是添加唯一索引
    [ "${support_foreign}x" == "1x" ] && osc_array+=("--alter-foreign-keys-method=auto") #是否可以使用外键参数
    [ "${check_slave_repl}x" == "allx" ] && check_slave_repl_list="${mysql_slave_info[@]}" || check_slave_repl_list="--check-slave-lag=${mysql_slave_host}"
    [ "${delete_mode_opt}x" != "1x" ] && osc_array+=("--no-drop-old-table") #pt-ost操作结束后, 删除旧表，默认状态是不删除, 会存在_tablename_old表
    return 0
}

